package org.budo.asr.service.huawei;

import org.budo.asr.service.api.AbstractAsrService;

import com.huawei.sis.bean.AuthInfo;
import com.huawei.sis.bean.SisConfig;
import com.huawei.sis.bean.SisConstant;
import com.huawei.sis.bean.request.AsrCustomLongRequest;
import com.huawei.sis.bean.response.AsrCustomLongResponse;
import com.huawei.sis.client.AsrCustomizationClient;
import com.huawei.sis.exception.SisException;
import com.huawei.sis.util.JsonUtils;

import lombok.Setter;

import lombok.Getter;

/**
 * @author lmw
 */
@Getter
@Setter
public abstract class AbstractHuaweiAsrService extends AbstractAsrService {
    private String ak = "";

    private String sk = "";

    private String region = ""; // 区域，如cn-north-1、cn-north-4

    private String projectId = ""; // 项目id。登录管理控制台，鼠标移动到右上角的用户名上，在下拉列表中选择我的凭证。在我的凭证页面，可以查看用户名、账号名，在项目列表中查看项目。多项目时，展开“所属区域”，从“项目ID”列获取子项目ID。

    /**
     * todo 请正确填写音频格式和模型属性字符串 1. 音频格式一定要相匹配. 例如obs url是xx.wav, 则在录音文件识别格式是auto。
     * 例如音频是pcm格式，并且采样率为8k，则格式填写pcm8k16bit。 如果返回audio_format is invalid 说明该文件格式不支持。
     *
     * 2. 音频采样率要与属性字符串的采样率要匹配。 例如格式选择pcm16k16bit，属性字符串却选择chinese_8k_common,
     * 则属于采样率不匹配 例如wav本身是16k采样率，属性选择chinese_8k_common, 同样属于采样率不匹配
     *
     * 3. 用户可以通过使用热词，识别专业术语，增加语句识别准确率。
     */

    protected String obj2Str(AsrCustomLongResponse response) {
        try {
            return JsonUtils.obj2Str(response, true);
        } catch (SisException e) {
            throw new RuntimeException(e);
        }
    }

    protected AsrCustomLongResponse getAsrLongResponse(AsrCustomizationClient asrCustomizationClient, String jobId) {
        try {
            return asrCustomizationClient.getAsrLongResponse(jobId);
        } catch (SisException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 3. 提交任务，获取jobId
     */
    protected String submitJob(AsrCustomizationClient asrCustomizationClient, AsrCustomLongRequest request) {
        try {
            return asrCustomizationClient.submitJob(request);
        } catch (SisException e) {
            throw new RuntimeException(e);
        }
    }

    protected AsrCustomizationClient asrCustomizationClient() {
        // 1. 初始化AsrCustomizationClient
        // 定义authInfo，根据ak，sk，region,projectId.
        AuthInfo authInfo = new AuthInfo(ak, sk, region, projectId);
        // 设置config，主要与超时有关
        SisConfig config = this.sisConfig();
        // 根据authInfo和config，构造AsrCustomizationClient
        AsrCustomizationClient asrCustomizationClient = new AsrCustomizationClient(authInfo, config);
        return asrCustomizationClient;
    }

    /**
     * 定义config，所有参数可选，设置超时时间等。
     */
    protected SisConfig sisConfig() {
        SisConfig config = new SisConfig();
        // 设置连接超时，默认10000ms
        config.setConnectionTimeout(SisConstant.DEFAULT_CONNECTION_TIMEOUT);
        // 设置读取超时，默认10000ms
        config.setReadTimeout(SisConstant.DEFAULT_READ_TIMEOUT);
        return config;
    }

    /**
     * 设置录音文件识别参数，所有参数均有默认值，不配置也可使用
     */
    protected void setLongParameter(AsrCustomLongRequest request) {
        // 设置否是添加标点，yes 或no， 默认是no
        request.setAddPunc("yes");
        // 设置是否将语音中的数字转写为阿拉伯数字，yes或no，默认yes
        request.setDigitNorm("no");
        // 设置声道，MONO/LEFT_AGENT/RIGHT_AGENT, 默认是单声道MONO
        request.setChannel("MONO");
        // 设置是否需要分析，默认为false。当前仅支持8k采样率音频。当其设置为true时，话者分离、情绪检测，速度、声道才生效。
        request.setNeedAnalysis(true);
        // 设置是否需要话者分离，若是，则识别结果包含role，默认true
        request.setDirization(true);
        // 设置是否需要情绪检测，默认true。
        request.setEmotion(true);
        // 设置是否需要速度。默认true。
        request.setSpeed(true);
    }
}